package com.xuyaxu.rabbitmq.simple;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * 简单消息模型（消费者）手动确认消息
 *
 * @author xyx
 * @date 2021/3/29 14:35
 */
public class SimpleRecv2 {

    private static final String QUEUE_NAME = "test_simple_queue";

    public static void main(String[] args) throws Exception {
        // 1.定义连接（rabbitmq）工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 设置服务器地址
        factory.setHost("127.0.0.1");
        // 设置服务器端口
        factory.setPort(5672);
        // 设置虚拟仓库名
        factory.setVirtualHost("my_vhost");
        // 设置用户名
        factory.setUsername("guest");
        // 设置密码
        factory.setPassword("guest");
        // 2.通过工厂获取连接
        Connection connection = factory.newConnection();
        // 3.从连接中创建通道，使用通道才能完成消息相关的操作
        Channel channel = connection.createChannel();
        // 4.声明（创建）队列，参数：队列名称  是否声明为持久队列  是否声明为排他队列  是否声明为自动删除队列  队列的其他参数
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 5.定义队列的消费者
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                // body即消息体
                String msg = new String(body);
                System.out.println("【simple】消费者2‘" + msg + "'");
                // 可以在实际业务中加try catch手动确认消息，如果消费失败，会把消息放到Unacked中等待下次消费
                /*try {
                    int i = 1 / 0;
                    // 手动进行ACK消息确认
                    channel.basicAck(envelope.getDeliveryTag(), false);
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("消费失败");
                }*/
                // 手动进行ACK消息确认
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        };
        // 监听队列，第二个参数：false，手动进行ACK
        channel.basicConsume(QUEUE_NAME, false, consumer);
    }

}
